#include <cstdlib>
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <string.h>
#include "Archivo.h"
#include <iostream>
#include <fstream>
#include <iostream>
#include <string>

#define ARCHIVO_H_
#define LONGITUDDEBUFFERCONFECHA 100 //renglon completo a escribir en el archivo
#define LONGITUDFECHA 24             //cantidad de caracteres que utiliza el string de fecha para componerse
#define MENUDEOPCIONES "Ingrese una de las siguientes opciones para continuar:\n1-Escribir\n2-Leer Todo\n3-Buscar por palabra\n4-Buscar por fechas\n0-Salir\n\nOpcion Numero:"
#define SALIR 0;/*si se modifica el menu esto puede tener que modificarse*/

using namespace std;

/********************************************************
**************FUNCION PONER EN ARCHIVO SIN PARAMETROS****
********************************************************/
char* hacerfecha(int dia,int mes, int anio);
bool encontrarPalabra(string oracion,string palabra);

void Archivo::putInFile(char * archivo)     {
  //escribir
  string str;
  cout << "Linea a guardar: ";
  cin >> str;
  
//  char* fechainventada=Archivo::getDate();
//  cout << fechainventada;
  
  
  ofstream myfile;
  myfile.open (archivo,ios::app);

  //este parrafo levanta la hora del sistema en un tipo char*
  time_t rawtime2;
  struct tm * timeinfo2;
  time ( &rawtime2 );
  timeinfo2 = localtime ( &rawtime2 );
  char* hora=asctime (timeinfo2);
  //este parrafito es para sacarle el /n del final a la hora
  char hora2[LONGITUDFECHA];
  strncpy (hora2,hora,LONGITUDFECHA);
  
  myfile << hora2 << "  " << str;
  myfile << "\n";
  myfile.close();
}

/*	
	
	
	
	
	
	
     FILE* pFile;
     char buffer [LONGITUDDEBUFFERCONFECHA];
     //inicializacion
     //Teoricamente no hace falta,pero al hacer dos inserciones seguidas
     //ocurria que utilizaba literalmente el mismo buffer y copiaba letras
     //de la insercion anterior.
     for (int j=0;j<=LONGITUDDEBUFFERCONFECHA;j++)
     {
     	char k=NULL;
     	strncpy (&buffer[j],&k,1);
     	}; 
     
     int contador=0; //para tener un limite en las pruebas
     
     //este parrafo levanta la hora del sistema en un tipo char*
     time_t rawtime;
     struct tm * timeinfo;
     time ( &rawtime );
     timeinfo = localtime ( &rawtime );
     char* str1= asctime (timeinfo);
     char str2='\n';
     char* pstr2=&str2;
     
     strncpy (buffer,str1,LONGITUDFECHA);                       //cargo la fecha al buffer
     string aux1="  ";
     str1=&aux1[0];                                             //separador de fecha y datos
     
     int espacioEntreFechaYDatos=strlen(str1);
     strncpy (buffer+LONGITUDFECHA,str1,espacioEntreFechaYDatos);     //inserto separador

     //si existe un archivo de log agrego, sino, lo creo     
     pFile = fopen ("myfile.txt" , "a");
     if (pFile == NULL) cout << "Error de apertura de archivo";
     else{
          	contador=contador+1;
          	cout << "ingrese una linea para el archivo:";
          	cin  >> str1;  
          	int longitudMensaje=strlen(str1);
          	strncpy (buffer+LONGITUDFECHA+espacioEntreFechaYDatos,str1,longitudMensaje);
            strncpy (buffer+LONGITUDFECHA+espacioEntreFechaYDatos+longitudMensaje,pstr2,1);
            fputs (buffer,   pFile);
            fclose (pFile);
          }
     };
*
  //escribir
  string str;
  cout << "Please enter full name: ";
  getline (cin,str);
  string line;
  ifstream database ("testdata.txt");
  if (database.is_open())
  {
      getline (database,line);
      cout << line << endl;
      database.close();
  }
  */
/********************************************************
*****************FUNCION LEER DE ARCHIVO SIN PARAMETROS**
********************************************************/
void Archivo::getOutFile()
{
     bool finDeArchivo=true; //logica inversa false >> fin de archivo
     int contador=0;
     FILE * pFile;
     char buffer [LONGITUDDEBUFFERCONFECHA];
     pFile = fopen ("myfile.txt" , "r");
     char pausa[1];
     if (pFile == NULL) perror ("Error opening file");
     else
     {
          while (finDeArchivo) {
         contador=contador+1;
         if ((contador%24)==0) 
              {
              printf("Presione enter para seguir...");
            cin >> pausa ;
            //gets (pausa);
              }
         fgets (buffer  ,LONGITUDDEBUFFERCONFECHA, pFile);
         /*Esta condicion se encuentra porque al final del archivo hay una linea en blanco
         y me ocurria que por esa linea me imprimia 2 veces la ultima linea porque las funciones
         ponen automaticamente el cursor en el proximo renglon y feof verifica el proximo renglon, 
         y NO DOS MAS ABAJO*/
         if ( feof (pFile) ) finDeArchivo=false;
         else {              
              try {
              	finDeArchivo=true;
              	fputs (buffer , stdout);
              	/*string dia;
              	//recupera el dia
                //strncpy (&dia[0],&buffer[8],2);  	
              	//recupera el anio
                strncpy (&dia[0],&buffer[20],4);
              	cout << (atoi (&dia[0]));
				cout << '\n';
              	cout << hacerfecha(23,12,2008);*/}
              catch(exception e){
                }
              };
         };
     fclose (pFile);
     }
};

void Archivo::lookForDate(char* dia,char* mes, char* anio){
     char buffer [LONGITUDDEBUFFERCONFECHA];
	 string strdia="dd";//ver nota
	 string strmes="mm";//ver nota
	 string stranio="aaaa";//ver nota
	 /* Parece innecesario definir inicalmente los strings pero ocurria que los apilaba en el mismo lugar
	  * y dejaba basura en todos si no estaban estas declaraciones iniciales y es el problema de porque
	  * otras funciones no tienen declarados parametros en su cabezera porque no encontraba la forma de 
	  * hacer que reconociera correctamente los char*!!!!!!!!!!*/
	 char endline='\n';
	 strncpy (&strdia[0],dia,2);
	 strncpy (&strdia[2],&endline,1);
	 strncpy (buffer,&strdia[0],3);//control
	 strncpy (&strmes[0],mes,3);
	 strncpy (&strmes[3],&endline,1);
	 strncpy (buffer,&strmes[0],4);//control
	 strncpy (&stranio[0],anio,4);
	 strncpy (&stranio[4],&endline,1);
	 strncpy (buffer,&stranio[0],5);//control
     bool finDeArchivo=true; //logica inversa false >> fin de archivo
     int contador=0;
     FILE * pFile;

     pFile = fopen ("myfile.txt" , "r");
     char pausa[1];
     if (pFile == NULL) perror ("Error opening file");
     else
     {
         while (finDeArchivo) 
         {
         	contador=contador+1;
         	if ((contador%24)==0) 
           	   	{
            	printf("Presione enter para seguir...");
              	cin >> pausa ;
              	}
         	string strbuffer;
         	fgets (&strbuffer[0],LONGITUDDEBUFFERCONFECHA, pFile);
         	strncpy (buffer,&strbuffer[0],LONGITUDDEBUFFERCONFECHA);
         	/*Esta condicion se encuentra porque al final del archivo hay una linea en blanco
         	y me ocurria que por esa linea me imprimia 2 veces la ultima linea porque las funciones
         	ponen automaticamente el cursor en el proximo renglon y feof verifica el proximo renglon, 
         	y NO DOS MAS ABAJO*/
         	if ( feof (pFile) ) finDeArchivo=false;
         	else {   
         			//string strquery;
         			//strncpy (&strquery[0],&query[0],strlen(query));
         			
         			//Cambiar por algun tipo de metodo dinamico
         			bool encontrado1=encontrarPalabra(strbuffer,strdia);//es es dia?
         			bool encontrado2=encontrarPalabra(strbuffer,strmes);//es esa mes?
         			bool encontrado3=encontrarPalabra(strbuffer,stranio);//es ese anio?
					if( encontrado1 && encontrado2 && encontrado3 )
					{
						try 
						{
							finDeArchivo=true;
        	      			fputs (buffer , stdout);
						}
        	      		catch(exception e){
       	         		}
       	       	    }//end if encontrado
       	    };//end else feof pfile
         };//end while fin de archivo
     fclose (pFile);
     }//end else      if (pFile == NULL)
}//end look for date




//
// *************CLASE hacer hora sin param****************




char* Archivo::getDate(){
  time_t rawtime;
  struct tm * timeinfo;
  int anio, mes ,dia;

  // prompt user for date 
  printf (" Anio (aaaa): "); scanf ("%d",&anio);
  printf (" Mes (mm): "); scanf ("%d",&mes);
  printf (" Dia: (dd)"); scanf ("%d",&dia);

  // get current timeinfo and modify it to the user's choice 
  time ( &rawtime );
  timeinfo = localtime ( &rawtime );
  timeinfo->tm_sec  = 0;
  timeinfo->tm_min  =0;
  timeinfo->tm_hour =0;
  timeinfo->tm_year = anio - 1900;
  timeinfo->tm_mon = mes - 1;
  timeinfo->tm_mday = dia;

  // call mktime: timeinfo->tm_wday will be set 
  mktime ( timeinfo );
  return (asctime (timeinfo));
}

/*
**************CLASE hacer hora con param****************
*/


/**
 * recordar que la hora 0 es la una de la maniana para los calculos
 * */
char* hacerfecha(int dia,int mes, int anio){
  time_t rawtime;
  struct tm * timeinfo;
  // prompt user for date 

  // get current timeinfo and modify it to the user's choice 
  time ( &rawtime );
  timeinfo = localtime ( &rawtime );
  timeinfo->tm_sec  = 0;
  timeinfo->tm_min  =0;
  timeinfo->tm_hour =0;
  timeinfo->tm_year = anio - 1900;
  timeinfo->tm_mon = mes - 1;
  timeinfo->tm_mday = dia;

  // call mktime: timeinfo->tm_wday will be set 
  mktime ( timeinfo );
  return (asctime (timeinfo));
}

bool encontrarPalabra(string oracion,string palabra)
{
	bool resultado=false;
	int x=0;/*posOracion*/ int y=0; //posPalabra
	if (palabra.size()==0) return resultado;
	y=0;//solo para quitar error de y no usada
	while (!((oracion[x]=='\n')||(oracion[x]=='\0')||resultado))
	//resultado->mientras que no haya encontrado recoro la oracion
	//(oracion[x]=='\n')||(oracion[x]=='\0') verif fin de oracion
	{
		if (oracion[x]==palabra[y]) 
		{
			y++;
			if (y==(int)palabra.size()) resultado=true;
		}
		else y=0;
		x++;
	};
	return resultado;
}

void Archivo::lookForWord(){

     string query;
     cout << "Letras a buscar (distingue mayusculas) :";
  	 cin >> query;

     bool finDeArchivo=true; //logica inversa false >> fin de archivo
     int contador=0;
     FILE * pFile;
     char buffer [LONGITUDDEBUFFERCONFECHA];
     pFile = fopen ("myfile.txt" , "r");
     char pausa[1];
     if (pFile == NULL) perror ("Error opening file");
     else
     {
         while (finDeArchivo) 
         {
         contador=contador+1;
         if ((contador%24)==0) 
              {
              printf("Presione enter para seguir...");
              cin >> pausa ;
              }
         string strbuffer;
         fgets (&strbuffer[0]  ,LONGITUDDEBUFFERCONFECHA, pFile);
         strncpy (buffer,&strbuffer[0],LONGITUDDEBUFFERCONFECHA);
         /*Esta condicion se encuentra porque al final del archivo hay una linea en blanco
         y me ocurria que por esa linea me imprimia 2 veces la ultima linea porque las funciones
         ponen automaticamente el cursor en el proximo renglon y feof verifica el proximo renglon, 
         y NO DOS MAS ABAJO*/
         if ( feof (pFile) ) finDeArchivo=false;
         else {   
         		//string strquery;
         		//strncpy (&strquery[0],&query[0],strlen(query));
         		bool encontrado=encontrarPalabra(strbuffer,query);          
				if(encontrado)
				{
					try 
					{
						finDeArchivo=true;
              			fputs (buffer , stdout);
              			/*string dia;
              			//recupera el dia
                		//strncpy (&dia[0],&buffer[8],2);  	
              			//recupera el anio
                		strncpy (&dia[0],&buffer[20],4);
              			cout << (atoi (&dia[0]));
						cout << '\n';
              			cout << hacerfecha(23,12,2008);*/}
              		catch(exception e){
                	}
              	}
              };
         };
     fclose (pFile);
     }

}


/*
**************CLASE PRINCIPAL****************
*/




int main(int argc, char *argv[])
{
	//declarations
    Archivo file;
    //para el menu de opciones
    string opcion="1";
    //para el caso de encontrar por fecha
    string meses[12] ={"Jan","Feb","Mar","Apr","May","Jun","Jul","Ago","Set","Oct","Nov","Dic"};
    string dia,anio;
    string mes;
    //donde guardo el nombre de archivo con un strncpy
	string str="myfile.txt";//a tomar de parametros
    // code section
    while (!((atoi (&opcion[0])) == 0 )) //ACA DECIA while (!(opcion == SALIR )) y no se porq empezo a dar error 
    {
		 cout << MENUDEOPCIONES ;
         cin  >> opcion ;
         switch (atoi (&opcion[0])){
         case 1: {//Escritura en archivo
	       	  	//cin >> str;//ESTO FUNCIONA!!!!!!!
              	file.putInFile(&str[0]);//imprime al archivo
              	break;}
         case 2: {//Lectura del archivo
              	file.getOutFile();
              	break;}
         case 3:{//busqueda de palabra
              	file.lookForWord();
              	break;}
         
         case 4:{//busqueda por fecha
     			caso4:
     			cout << "Ingrese dia (dd): ";	 		cin >> dia;
              	cout << "Ingrese mes (mm): ";			cin >> mes;
              	cout << "Ingrese anio (aaaa): ";		cin >> anio;
              	//si no es fecha valida en esta linea vuelvo a pedirlas, anio no valido a partir de 2015
              	if 	(
              		(atoi (&dia[0])<1)		||	(atoi (&dia[0])>31)		||
              		(atoi (&mes[0])<1)		||	(atoi (&mes[0])>12)				||
              		(atoi (&anio[0])<1901)	||	((atoi (&anio[0]))>2015)	
              		) goto caso4;
              	file.lookForDate(&dia[0],&meses[atoi (&mes[0])-1][0],&anio[0]);
              	break;}
         default:{
              	break;}
         };//switch
    };//while
    return 0;
}//main
